#include "myhead.h"

int main(int argc, char const *argv[])
{
    // 创建socket
    int sfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sfd == -1)
    {
        perror("socket创建失败");
        return -1;
    }

    // 创建 ip 端口结构体
    struct sockaddr_in s_addr;
    s_addr.sin_family = AF_INET;
    s_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    s_addr.sin_port = htons(3000);

    // 设置套接字属性避免服务器退出短时间内端口没有被释放
    int option_val = 1;//非零值
    int ret = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &option_val, sizeof(option_val));
    if (ret == -1)
    {
        perror("设置socket属性失败");
        close(sfd);
        return -1;
    }

    // 绑定服务器
    ret = bind(sfd, (struct sockaddr *)&s_addr, sizeof(s_addr));
    if (ret == -1)
    {
        perror("服务器ip端口绑定失败");
        close(sfd);
        return -1;
    }

    // 启动服务器，开启TCP连接请求的监听
    ret = listen(sfd, 1);
    if (ret == -1)
    {
        perror("服务器启动失败");
        close(sfd);
        return -1;
    }
    else
    {
        printf("服务器正在运行，监听地址为 192.168.6.143:3000\n");
    }

    while (1)  // 持续监听新的连接请求
    {
        struct sockaddr_in c_addr;
        socklen_t c_len = sizeof(c_addr);

        // 接收客户端发来的连接请求
        int new_socket = accept(sfd, (struct sockaddr *)&c_addr, &c_len);
        if (new_socket == -1)
        {
            perror("接受连接失败");
            continue;  // 继续等待下一个连接
        }

        // 打印客户端信息
        printf("与 %s:%d 连接成功\n", inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port));

        char buf[100];
        while (1)
        {
            bzero(buf, sizeof(buf));
            ret = recv(new_socket, buf, sizeof(buf), 0);
            if (ret == 0)
            {
                printf("客户端: %d断开连接\n",ntohs(c_addr.sin_port));
                close(new_socket);  // 关闭与客户端的连接
                break;
            }
            else if (ret == -1)
            {
                perror("接收消息失败");
                close(new_socket);
                break;
            }

            printf("收到客户端消息：%s\n", buf);

            // 向客户端发送响应
            bzero(buf, sizeof(buf));
            printf("请输入想要发送给客户端的消息：\n");
            scanf("%s", buf);

            ret = send(new_socket, buf, strlen(buf), 0);
            if (ret == -1)
            {
                perror("发送消息失败");
                close(new_socket);
                break;
            }
        }
    }

    close(sfd);  // 关闭监听套接字
    return 0;
}